<?php

/**
 * @author 	: Le Nguyen Thien An <thienan289@gmail.com>
 */

/**
 * This is the model class for table "dnd_boxanhfood_administator".
 *
 * The followings are the available columns in table 'dnd_boxanhfood_administator':
 * @property string $id
 * @property string $username
 * @property string $password
 * @property string $email
 * @property string $last_login
 * @property integer $status
 * @property string $creation_datetime
 * @property string $last_update
 * @property integer $deleted
 */
class Administator extends CActiveRecord
{
   const STATUS_ACTIVE 		= 1;
   const STATUS_DEACTIVE 	= 0;

   public $password_repeat;

   public function getStatusText()
   {
   		if (isset($this->status))
   		{
   			if (isset($this->statusOptions[$this->status]))
   			{
   				return $this->statusOptions[$this->status];
   			}
   		}
   		return "unknown";
   } 

   public function getStatusOptions()
   {
   		return array (self::STATUS_ACTIVE => 'Active', self::STATUS_DEACTIVE => 'Deactive');
   }

	public function beforeSave() 
	{
		$now = self::getNowString();
		if ($this->isNewRecord)
		{
			$this->creation_datetime = $now;
		}
        
    	$this->last_update = $now;

		return parent::beforeSave();
	}

	public function afterSave()
	{
		$auth = Yii::app()->authManager;
		if ($this->isNewRecord)
		{
			try
			{
				$auth->assign(AdministatorController::ROLE_ADMINISTATOR, $this->primaryKey);
			}
			catch (Exception $e)
			{
				$model=Administator::model()->findByPk($this->primaryKey);
				if ($model)
				{
					$model->delete();
				}
				throw new CHttpException(404, "Failed to create admin. Please try again later");
			}
		}

		return parent::afterSave();
	}

	public static function hashPassword($password)
	{
		return CPasswordHelper::hashPassword($password);
	}

	public function validatePassword($password)
	{
		return CPasswordHelper::verifyPassword($password, $this->password);
	}

	public static function getNowString()
	{
		$dt = new DateTime();
		$now = $dt->format('Y-m-d h:i:s');
		return $now;
	}

	protected function afterValidate()
	{
		parent::afterValidate();
		if (!$this->hasErrors())
		{
			$this->password = Administator::hashPassword($this->password);
		}
	}

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'dnd_boxanhfood_administator';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('status, deleted', 'numerical', 'integerOnly'=>true),
			array('username, password, email', 'length', 'max'=>255),
			array('username', 'match', 'pattern' => '/^[A-Za-z0-9_]+$/u'),
			array('password', 'compare'),
			array('password_repeat', 'safe'),
			array('username, password, password_repeat', 'required'),
			array('username', 'unique', 'caseSensitive' => false),
			array('status', 'default', 'value' => 1),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id, username, password, email, last_login, status, creation_datetime, last_update, deleted', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'username' => 'Username',
			'password' => 'Password',
			'email' => 'Email',
			'last_login' => 'Last Login',
			'status' => 'Status',
			'creation_datetime' => 'Creation Datetime',
			'last_update' => 'Last Update',
			'deleted' => 'Deleted',
			'statusText' => 'Status',
			//'password_repeat' => 'Confirm Password'
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 *
	 * Typical usecase:
	 * - Initialize the model fields with values from filter form.
	 * - Execute this method to get CActiveDataProvider instance which will filter
	 * models according to data in model fields.
	 * - Pass data provider to CGridView, CListView or any similar widget.
	 *
	 * @return CActiveDataProvider the data provider that can return the models
	 * based on the search/filter conditions.
	 */
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

		$criteria->compare('id',$this->id,true);
		$criteria->compare('username',$this->username,true);
		$criteria->compare('password',$this->password,true);
		$criteria->compare('email',$this->email,true);
		$criteria->compare('last_login',$this->last_login,true);
		$criteria->compare('status',$this->status);
		$criteria->compare('creation_datetime',$this->creation_datetime,true);
		$criteria->compare('last_update',$this->last_update,true);
		$criteria->compare('deleted',$this->deleted);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}

	/**
	 * Returns the static model of the specified AR class.
	 * Please note that you should have this exact method in all your CActiveRecord descendants!
	 * @param string $className active record class name.
	 * @return Administator the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}
}
